/*
题目: 考试的最大困扰度
一位老师正在出一场由 n 道判断题构成的考试，每道题的答案为 true （用 'T' 表示）或者 false （用 'F' 表示）。老师想增加学生对自己做出答案的不确定性，方法是 最大化 有 连续相同 结果的题数。（也就是连续出现 true 或者连续出现 false）。

给你一个字符串 answerKey ，其中 answerKey[i] 是第 i 个问题的正确结果。除此以外，还给你一个整数 k ，表示你能进行以下操作的最多次数：

    每次操作中，将问题的正确答案改为 'T' 或者 'F' （也就是将 answerKey[i] 改为 'T' 或者 'F' ）。

请你返回在不超过 k 次操作的情况下，最大 连续 'T' 或者 'F' 的数目。

https://leetcode.cn/problems/maximize-the-confusion-of-an-exam
 */
public class MaxConsecutiveAnswersShit {
    public int maxConsecutiveAnswers(String answerKey, int k) {
        int n = answerKey.length();
        int Tk = 0; // 窗口内 T 的数量
        int Fk = 0; // 窗口内 F 的数量
        int left = 0; // 左窗口

        // 维护 一个 'T' 和 'F' 的数量都不超过 K 的窗口
        // 维持 窗口 的 不减性
        for (int i = 0; i < n; i ++) {
            char ch = answerKey.charAt(i);
            if (ch == 'T')
                Tk ++;
            else
                Fk ++;

            if (Tk > k && Fk > k) {
                char lc = answerKey.charAt(left);
                if (lc == 'T')  Tk --;
                else            Fk --;
                left ++;
            }
        }

        return n - left;
    }

    // 初级版本 ---------------------------------------------------------------------------------------------------------
    int src = 0;
    int n ;

    public int maxConsecutiveAnswersShit(String answerKey, int k) {
        n = answerKey.length();
        helper(answerKey, k, 'T');
        helper(answerKey, k, 'F');
        return src;
    }

    private void helper(String exp, int k, char mark) {
        int left = 0;
        int kk = 0;
        // 直接利用 k 将窗口 撑到最大
        for (int i = 0; i < n; i ++) {
            char ch = exp.charAt(i);
            if (ch != mark) kk ++;

            while (kk > k && left <= i) {
                if (exp.charAt(left) != mark) {
                    kk --;
                }
                left ++;
            }

            src = Math.max(src, i - left + 1);
        }
    }
}
